SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[paChequearIniciodeLicencia10]
@IdCola INT,
@CausaDeError INT,
@Resultado INT OUTPUT,
@Diagnostico VARCHAR(1000) OUTPUT
AS
SET NOCOUNT ON
SET DATEFORMAT dmy
PRINT 'pasa chequeo especifico'
DECLARE @SitRev INT
DECLARE @Fecha1 DATETIME, @Fecha2 DATETIME, @UTCAntMin INT, @UTAntMin INT, @Agente INT, @AntiguedadMinima INT, @Enfermedad INT, @Licencia INT
DECLARE @UTDurMax INT, @FechaAEvaluar DATETIME, @SubServicio INT, @Dias INT, @DuracionMax INT, @FechaProbableDeTermino DATETIME
DECLARE @IDServicioAgente INT 

SELECT @Enfermedad = Enfermedad, @SubServicio = Servicio FROM tb_PlazasDeMovimiento WHERE IdCola = @IdCola
SELECT @IDServicioAgente=ServicioAgente  FROM tb_SubServiciosAgentes WHERE IdSubServicio = @SubServicio

SELECT @Fecha1 = Fecha1, @Fecha2 = Fecha2, @Agente = Agente, @Licencia = Licencia, @FechaProbableDeTermino = FechaTermino, @SitRev= SitRev 
FROM tb_ColaDeMovimientos WHERE IdCola = @IdCola

SELECT @UTCAntMin = UTCAntiguedadMinima, @UTAntMin = UTAntiguedadMinima, @UTDurMax = UTDuracionMaxima 
FROM tb_Licencias WHERE IdLicencia = @Licencia
DECLARE @DuracionMax1 INT


SELECT @Dias = 0
SELECT @AntiguedadMinima = 0
SELECT @DuracionMax = 30
SELECT @DuracionMax1=35

IF @Fecha2 IS NULL
	IF @FechaProbableDeTermino IS NOT NULL
		SELECT @FechaAEvaluar = @FechaProbableDeTermino
	ELSE
		SELECT @FechaAEvaluar = GETDATE()
ELSE
	SELECT @FechaAEvaluar = @Fecha2
--Verificar que la licencia anterior no sea una licencia extraordinaria sin goce de haberes
DECLARE @licanterior INT
DECLARE @checlicext INT
set @checlicext=0
set @licanterior=(select top 1  licencia from tb_subserviciosAgentes as ss inner join tb_serviciosAgentes as s on ss.ServicioAgente=s.idServicioAgente inner join tb_Agentes as a on s.Agente=a.idAgente Where a.idAgente=@Agente AND ss.Licencia=@Licencia order by idsubservicio)
--set @licanterior=(select top 1  licencia from tb_LicenciasHistoricas order by idLicenciaHistorica)
 if @licanterior=32
 BEGIN
 set @checlicext=1
 END
 if @licanterior=34
 BEGIN
 set @checlicext=1
 END
 if @licanterior=35
 BEGIN
 set @checlicext=1
 END
 if @licanterior=36
 BEGIN
 set @checlicext=1
 END
 if @licanterior=37
 BEGIN
 set @checlicext=1
 END
 
--Ver el acumulado en el año 
DECLARE @Acumuladodias INT
DECLARE @Acumuladodias1 INT
DECLARE @fec1 DATETIME
DECLARE @fec2 DATETIME
SET @fec1='01/01/'+CONVERT(VARCHAR, YEAR(@Fecha1))
SET @fec2= GETDATE()
--SET @Acumuladodias=(SELECT COUNT(dias) From tb_LicenciasHistoricas WHERE FechaAlta BETWEEN @fec1 AND @fec2 AND Licencia=@Licencia AND Agente=@Agente)
--Cursor para calcular el acumulado de dias correspondiente a esta licencia

  --Vbles del cursor
  Declare @FechaAlta DATETIME 
  Declare @FechaBaja DATETIME
  --Vbles para el acumulado
  Declare @cantidaddias INT
  Declare @cantidaddias1 INT
  set @cantidaddias=0
  set @cantidaddias1=0
  Declare @fc1 DATETIME
  DECLARE @fc2 Datetime
--Declarar el cursor
Declare curAcumuladoDias CURSOR FORWARD_ONLY FOR
Select ss.fechaalta,ss.fechatermino from tb_subserviciosAgentes as ss inner join tb_serviciosAgentes as s on ss.ServicioAgente=s.idServicioAgente inner join tb_Agentes as a on s.Agente=a.idAgente Where a.idAgente=@Agente AND ss.servicioAgente= @IDServicioAgente AND ss.Licencia=@Licencia AND ss.FechaAlta BETWEEN @fec1 AND @fec2 
--ABRIMOS Y RECORREMOS EL CURSOR
open curAcumuladoDias
fetch next from curAcumuladoDias into @FechaAlta, @FechaBaja
while (@@FETCH_STATUS = 0)
BEGIN
  
  SET @fc1=@FechaAlta
  SET @fc2=@FechaBaja
 if @fc2 is not null 
 BEGIN
  IF @fc1 <= GETDATE()
  BEGIN
   SET @fc1=@FechaAlta
   SET @fc2=@FechaBaja
  SET @cantidaddias=@cantidaddias+DATEDIFF(dd,@fc1,@fc2)
  END
  IF @fc1 >  GETDATE()
  BEGIN
  SET @fc1=@FechaAlta
  SET @fc2=@FechaBaja
  SET @cantidaddias1=@cantidaddias1+DATEDIFF(dd,@fc1,@fc2)
  END
END
fetch next from curAcumuladoDias into @FechaAlta, @FechaBaja
END
close curAcumuladoDias
deallocate curAcumuladoDias		
-- Fin del Cursor


-- Verifico la antiguedad minima que permite la licencia teniENDo en cuenta la UT y la UTC
DECLARE @antiguedad INT
DECLARE @fecha datetime
-- En el Año
IF @UTCAntMin = 1
	BEGIN
	SELECT @fecha = CAST('01/01/'+CAST(YEAR(@Fecha1) AS VARCHAR(4)) AS DATETIME)
	END
-- En el año de servicio?
IF @UTCAntMin = 2
	BEGIN
	SELECT @fecha  = DATEADD(DAY, -365, @Fecha1)
	END
-- en Total
IF @UTCAntMin = 6
	SELECT @fecha = MIN(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @Agente group by Agente
-- En el Decenio
IF @UTCAntMin = 5
	BEGIN
	SELECT @fecha='01/01/'+CONVERT(VARCHAR,DATEPART(YEAR,@Fecha1)-9)
	END
-- En el Bieño
IF @UTCAntMin = 4
	BEGIN
	SELECT @fecha = '01/01/'+CONVERT(VARCHAR, YEAR(@Fecha1)-1)
	END
-- En el mes calENDario
IF @UTCAntMin = 3
	BEGIN
	SELECT @fecha='01/'+CONVERT(VARCHAR,DATEPART(MONTH,@Fecha1))+CONVERT(VARCHAR,DATEPART(YEAR,@Fecha1))
	END
--Si la antiguedad se mide en dias Corridos
IF @UTAntMin  = 1
	BEGIN
	EXEC spAntiguedadAgente @Agente, @fecha, @Fecha1, @antiguedad output
	END
ELSE
	EXEC spAntiguedadAgenteHab @Agente, @fecha, @Fecha1, @antiguedad output
--Verifico q la antiguedad del agente hasta el 31 de diciembre del año corriente 
DECLARE @fecan DATETIME
set @fecan= CAST('31/12/'+CAST(YEAR(@Fecha1) AS VARCHAR(4)) AS DATETIME)
-- En el Año
IF @UTCAntMin = 1
	BEGIN
	SELECT @fecha = CAST('01/01/'+CAST(YEAR(@Fecha1) AS VARCHAR(4)) AS DATETIME)
	END
-- En el año de servicio?
IF @UTCAntMin = 2
	BEGIN
	SELECT @fecha  = DATEADD(DAY, -365, @Fecha1)
	END
-- en Total
IF @UTCAntMin = 6
	SELECT @fecha = MIN(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @Agente group by Agente
-- En el Decenio
IF @UTCAntMin = 5
	BEGIN
	SELECT @fecha='01/01/'+CONVERT(VARCHAR,DATEPART(YEAR,@Fecha1)-9)
	END
-- En el Bieño
IF @UTCAntMin = 4
	BEGIN
	SELECT @fecha = '01/01/'+CONVERT(VARCHAR, YEAR(@Fecha1)-1)
	END
-- En el mes calENDario
IF @UTCAntMin = 3
	BEGIN
	SELECT @fecha='01/'+CONVERT(VARCHAR,DATEPART(MONTH,@Fecha1))+CONVERT(VARCHAR,DATEPART(YEAR,@Fecha1))
	END
--Si la antiguedad se mide en dias Corridos
IF @UTAntMin  = 1
	BEGIN
	EXEC spAntiguedadAgente @Agente, @fecha, @fecan, @antiguedad output
	END
ELSE
	EXEC spAntiguedadAgenteHab @Agente, @fecha, @fecan, @antiguedad output

DECLARE @ant INT
If @antiguedad>=20
BEGIN
set @ant=1
--Ver si tiene dias de licencia del año anterior
DECLARE @diasafavor INT
set @diasafavor=0 
DECLARE @Acumuladodiasafavor INT
SET @Acumuladodiasafavor=0
SET @fec1='01/01/'+CONVERT(VARCHAR, YEAR(@Fecha1)-1)
SET @fec2='31/12/'+CONVERT(VARCHAR, YEAR(@Fecha1)-1)
--SET @Acumuladodiasafavor=(SELECT COUNT(dias) From tb_LicenciasHistoricas WHERE FechaAlta BETWEEN @fec1 AND @fec2 AND Licencia=@Licencia AND Agente=@Agente)
--set @diasafavor=@DuracionMax1-@Acumuladodiasafavor

--Cursor para calcular el acumulado de dias del año anterior correspondiente a esta licencia 

--Declarar el cursor
Declare curAcumuladoDiasañoanterior CURSOR FORWARD_ONLY FOR
Select ss.fechaalta,ss.fechatermino from tb_subserviciosAgentes as ss inner join tb_serviciosAgentes as s on ss.ServicioAgente=s.idServicioAgente inner join tb_Agentes as a on s.Agente=a.idAgente Where a.idAgente=@Agente AND ss.servicioAgente= @IDServicioAgente AND ss.Licencia=@Licencia AND ss.FechaAlta BETWEEN @fec1 AND @fec2 
--ABRIMOS Y RECORREMOS EL CURSOR
open curAcumuladoDiasañoanterior
fetch next from curAcumuladoDiasañoanterior into @FechaAlta, @FechaBaja
while (@@FETCH_STATUS = 0)
BEGIN
  
  SET @fc1=@FechaAlta
  SET @fc2=@FechaBaja
  SET @Acumuladodiasafavor=@Acumuladodiasafavor+DATEDIFF(dd,@fc1,@fc2)
  
fetch next from curAcumuladoDiasañoanterior into @FechaAlta, @FechaBaja
END
close curAcumuladoDiasañoanterior
deallocate curAcumuladoDiasañoanterior		
-- Fin del Cursor
set @diasafavor=@DuracionMax1-@Acumuladodiasafavor


--Sumar los dias a favor a la duracion maxima de dias a pedir del agente
set @DuracionMax1=@DuracionMax1+@diasafavor
END
ELSE
BEGIN
set @ant=0
--Ver si tiene dias de licencia del año anterior
SET @fec1='01/01/'+CONVERT(VARCHAR, YEAR(@Fecha1)-1)
SET @fec2='31/12/'+CONVERT(VARCHAR, YEAR(@Fecha1)-1)
SET @Acumuladodiasafavor=(SELECT COUNT(dias) From tb_LicenciasHistoricas WHERE FechaAlta BETWEEN @fec1 AND @fec2 AND Licencia=@Licencia AND Agente=@Agente)
set @diasafavor=@DuracionMax1-@Acumuladodiasafavor

--Cursor para calcular el acumulado de dias del año anterior correspondiente a esta licencia 

--Declarar el cursor
Declare curAcumuladoDiasañoanterior1 CURSOR FORWARD_ONLY FOR
Select ss.fechaalta,ss.fechatermino from tb_subserviciosAgentes as ss inner join tb_serviciosAgentes as s on ss.ServicioAgente=s.idServicioAgente inner join tb_Agentes as a on s.Agente=a.idAgente Where a.idAgente=@Agente AND ss.servicioAgente= @IDServicioAgente AND ss.Licencia=@Licencia AND ss.FechaAlta BETWEEN @fec1 AND @fec2 
--ABRIMOS Y RECORREMOS EL CURSOR
open curAcumuladoDiasañoanterior1
fetch next from curAcumuladoDiasañoanterior1 into @FechaAlta, @FechaBaja
while (@@FETCH_STATUS = 0)
BEGIN
  
  SET @fc1=@FechaAlta
  SET @fc2=@FechaBaja
  SET @Acumuladodiasafavor=@Acumuladodiasafavor+DATEDIFF(dd,@fc1,@fc2)
  
fetch next from curAcumuladoDiasañoanterior1 into @FechaAlta, @FechaBaja
END
close curAcumuladoDiasañoanterior1
deallocate curAcumuladoDiasañoanterior1		
-- Fin del Cursor
set @diasafavor=@DuracionMax-@Acumuladodiasafavor


--Sumar los dias a favor a la duracion maxima de dias a pedir del agente
set @DuracionMax=@DuracionMax+@diasafavor

END


-- Verifica la duracion maxima de la licencia. Si no se especifica la fecha de baja se agrega un mensaje de alerta
-- Miro si el sub servicio anterior tambien tenia la misma licencia...
DECLARE @F1 DATETIME
IF @FechaAEvaluar IS NOT NULL
	BEGIN
	IF (SELECT Licencia FROM tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio) = @Licencia
	BEGIN
		IF (@UTDurMax = 1)
		BEGIN
			SELECT @F1 = FechaAlta FROM tb_SubServiciosagentes WHERE idSubServicio = @SubServicio
			SELECT @dias = DATEDIFF(DAY, @F1, @Fecha1)
		END
		ELSE
		BEGIN
			SELECT @F1 = FechaAlta FROM tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio
			EXEC @dias = spDIFDiasHabiles @Fecha1, @FechaAEvaluar
		END
	END		
	IF (@UTDurMax = 1)
		SELECT @dias = @dias+DATEDIFF(DAY, @Fecha1, @FechaAEvaluar)
	ELSE
	BEGIN
		DECLARE @dias2 INT
		EXEC @dias2 = spDIFDiasHabiles @Fecha1, @FechaaEvaluar
		SELECT @Dias = @dias + @dias2
	END

END
--Verificar el Acumulado de Dias
SET @Acumuladodias=@cantidaddias+@Dias
SET @Acumuladodias1=@cantidaddias1+@Dias
DECLARE @totalacumulado INT
set @totalacumulado=@Acumuladodias+@Acumuladodias1
--Verificar la fecha de utilizacion 
 DECLARE @fecutil1 DATETIME
 DECLARE @fecutil2 DATETIME
 DECLARE @bfecutil INT --bandera para controlar q la fecha de ultizacion de la licencia se encuentre en el periodo comprendido
 SET @bfecutil=0
 SET @fecutil1='01/01/'+CONVERT(VARCHAR, YEAR( GETDATE()))
 SET @fecutil2='31/12/'+CONVERT(VARCHAR, YEAR( GETDATE()))
 IF  @FechaAEvaluar > @fecutil1 AND  @FechaAEvaluar < @fecutil2
 set @bfecutil=1
 --verificar que se pueda tomar solo la licencia en 2 fracciones de ese año
  DECLARE @contadorlic INT
  DECLARE @banlic INT
  SET @banlic=0
  SET @contadorlic=(SELECT COUNT (idsubservicio) From tb_subserviciosAgentes as ss inner join tb_serviciosAgentes as s on ss.ServicioAgente=s.idServicioAgente inner join tb_Agentes as a on s.Agente=a.idAgente Where a.idAgente=@Agente AND ss.Licencia=@Licencia AND ss.FechaAlta BETWEEN @fecutil1 AND @fecutil2) 
  IF @contadorlic > 2
  SET @banlic=1
  --ver si la antiguedad es menor a 6 meses calcular el proporcional q le perimite
 DECLARE @antiguedadenmeses INT
 DECLARE @fecalta DATETIME
 DECLARE @bfecpor INT
 SET @bfecpor=0
 SET @fecalta=(SELECT FechaAlta from tb_agentes where idAgente=@Agente)
 SET @antiguedadenmeses=(SELECT DATEDIFF(MM,@FechaAEvaluar,@fecalta))
 DECLARE @calculopor INT
 IF @antiguedadenmeses < 7 
 -- calculo 30 * cantidad de meses / 12
BEGIN
SET @calculopor= (30*@antiguedadenmeses) / 12
END  
--SELECT @AntiguedadMinima AntiguedadMinima, @Antiguedad Antiguedad, @Dias Dias, @DuracionMax DurMax, @CausaDeError

IF @AntiguedadMinima > @Antiguedad AND ( (@Enfermedad IS NULL) OR (@Enfermedad IS NOT NULL AND @Enfermedad NOT IN (SELECT IdEnfermedad FROM tb_Enfermedades WHERE NoCuentaAntiguedadParaLicencia = 'S')))  AND @CausaDeError = 19
	SELECT @Resultado = 1,@Diagnostico ='*'+'El agente tiene '+CONVERT(VARCHAR, @antiguedad)+' dias de servicio. Para gozar la licencia se necesitan mas de '+CONVERT(VARCHAR, @AntiguedadMinima)
ELSE

IF @bfecpor=1
BEGIN
SELECT @Resultado = 1,@Diagnostico ='*'+'El agente puede tomarse solo hasta'+CONVERT(VARCHAR, @calculopor)
END
ELSE

IF @checlicext=1
BEGIN
SELECT @Resultado = 1,@Diagnostico ='*'+'El agente posee una licencia extraordinaria anterior'
END
ELSE
IF @bfecutil=1
BEGIN
SELECT @Resultado = 1,@Diagnostico ='*'+'La fecha de licencia no corresponde al periodo valido'
END
ELSE
IF @banlic=1
BEGIN
SELECT @Resultado = 1,@Diagnostico ='*'+'El agente no puede tomarse la licencia ya posee 2 fracciones en este año'
END
ELSE
IF @ant=0
 BEGIN
 
 IF @totalacumulado > @DuracionMax
  SELECT @Resultado = 1,@Diagnostico ='*'+'El agente tiene un acumulado de '+CONVERT(VARCHAR, @cantidaddias)+' anterior a la fecha y '+CONVERT(VARCHAR, @cantidaddias1)+' posterior a la fecha'+' Y El agente se tomaria '+CONVERT(VARCHAR, @dias)+' ,total='+CONVERT(VARCHAR, @dias+@cantidaddias1+@cantidaddias)+' dias y no puede tomarse en el año calendario mas de  '+CONVERT(VARCHAR, @DuracionMax)
 
 -- SELECT @Resultado = 1,@Diagnostico ='*'+'El agente tiene un acumulado de'+CONVERT(VARCHAR, @cantidaddias)+'Y El agente se tomaria '+CONVERT(VARCHAR, @dias)+' dias y no puede tomarse en el año calendario mas de  '+CONVERT(VARCHAR, @DuracionMax)
  --IF @Acumuladodias1 > @DuracionMax
  --SELECT @Resultado = 1,@Diagnostico ='*'+'El agente tiene un acumulado de'+CONVERT(VARCHAR, @cantidaddias1)+' dias posterior a la fecha Y El agente se tomaria '+CONVERT(VARCHAR, @dias)+' dias y no puede tomarse en el año calendario mas de  '+CONVERT(VARCHAR, @DuracionMax)
	ELSE
	IF @Dias > @DuracionMax AND @CausaDeError = 19
		SELECT @Resultado = 1,@Diagnostico ='*'+'El agente se tomaria '+CONVERT(VARCHAR, @dias)+' dias y no puede tomarse mas de  '+CONVERT(VARCHAR, @DuracionMax)
  END
IF @ant=1
 BEGIN
  IF @Acumuladodias > @DuracionMax1
  SELECT @Resultado = 1,@Diagnostico ='*'+'El agente tiene un acumulado de'+CONVERT(VARCHAR, @cantidaddias)+'Y El agente se tomaria '+CONVERT(VARCHAR, @dias)+' dias y no puede tomarse en el año calendario mas de  '+CONVERT(VARCHAR, @DuracionMax)
  IF @Acumuladodias1 > @DuracionMax1
  SELECT @Resultado = 1,@Diagnostico ='*'+'El agente tiene un acumulado de'+CONVERT(VARCHAR, @cantidaddias1)+' dias posterior a la fecha Y El agente se tomaria '+CONVERT(VARCHAR, @dias)+' dias y no puede tomarse en el año calendario mas de  '+CONVERT(VARCHAR, @DuracionMax)
  ELSE
  IF @Dias > @DuracionMax1 AND @CausaDeError = 19
  SELECT @Resultado = 1,@Diagnostico ='*'+'El agente se tomaria '+CONVERT(VARCHAR, @dias)+' dias y no puede tomarse mas de  '+CONVERT(VARCHAR, @DuracionMax)
 END

	ELSE
		IF @antiguedadminima < @antiguedad AND @Dias < @duracionmax AND @CausaDeError = 19
			SELECT @resultado = 0, @diagnostico = ''
GO
